#include "siblinglist.h"

#include "uml/umlrelationalitem.h"

SiblingList::SiblingList()
{
}

SiblingList::~SiblingList()
{
}

void SiblingList::addItem(UmlRelationalItem *item)
{
    this->addToXList(item);
    this->addToYList(item);

    emit this->dataChanged();
}

void SiblingList::removeItem(UmlRelationalItem *item)
{    
    this->_xList.removeOne(item);
    this->_yList.removeOne(item);

    emit this->dataChanged();
}

QList<UmlRelationalItem*> SiblingList::xSiblings()
{
    return this->_xList;
}

QList<UmlRelationalItem*> SiblingList::ySiblings()
{
    return this->_yList;
}

bool SiblingList::isEmpty()
{
    return this->_xList.isEmpty() && this->_yList.isEmpty();
}

void SiblingList::addToXList(UmlRelationalItem *item)
{
    // falls die Liste leer ist
    if (this->_xList.isEmpty()) {
        this->_xList.append(item);
    }

     // sonst
    else {
        int i = 0;
        UmlRelationalItem *currentItem = this->_xList.at(i);
        while (i < this->_xList.count() && item->centerPos().x() < currentItem->centerPos().x()) {
            i++;
        }
        this->_xList.insert(i, item);
    }

    this->_minX = this->_xList.first()->centerPos().x();
    this->_maxX = this->_xList.last()->centerPos().x();
}

void SiblingList::addToYList(UmlRelationalItem *item)
{
    // falls die Liste leer ist
    if (this->_yList.isEmpty()) {
        this->_yList.append(item);
    }

     // sonst
    else {
        int i = 0;
        UmlRelationalItem *currentItem = this->_yList.at(i);
        while (i < this->_yList.count() && item->centerPos().y() < currentItem->centerPos().y()) {
            i++;
        }
        this->_yList.insert(i, item);
    }

    this->_minY = this->_yList.first()->centerPos().y();
    this->_maxY = this->_yList.last()->centerPos().y();
}
